#include "xsUI.hpp"
 
namespace xs
{

//=================================================================================================
// Window::Window
//=========

Window::Window(): state(UIS_NONE), style(0), x(0), y(0), width(0), height(0), show(true), m_parent(0), id(0)
{
}

//=================================================================================================
// Window::~Window
//=========

Window::~Window()
{
	while(m_childs.empty()==false)
		remove_window(m_childs.back());

	if(m_parent)
	{
		m_parent->remove_window(this);
	}
}

//=================================================================================================
// Window::add_window
//=========

void Window::add_window(Window *wnd)
{
	if(wnd->m_parent)
	{
		wnd->m_parent->remove_window(wnd);
	}
	wnd->m_parent = this;

	m_childs.push_back(wnd);
}

//=================================================================================================
// Window::remove_window
//=========

void Window::remove_window(Window *wnd)
{
	if(wnd->m_parent == this)
	{
		std::vector<Window*>::iterator it =
			std::find(m_childs.begin(), m_childs.end(), wnd);
		m_childs.erase(it);

		wnd->m_parent = 0;
	}
}

//=================================================================================================
// Window::bring_to_top
//=========

void Window::bring_to_top()
{
	if(m_parent)
	{
		m_parent->add_window(this);
	}
}

//=================================================================================================
// Window::get_window_at
//=========

Window* Window::get_window_at(float _x, float _y)
{
	if(!show || !(_x>=x && _y>=y && _x<x+width && _y<y+height))
		return 0;

	for(s32 i=m_childs.size()-1; i>=0; i--)
	{
		Window *wnd = m_childs[i];

		Window *found = wnd->get_window_at(_x-x, _y-y);

		if(found) return found;
	}

	return this;
}

//=================================================================================================
// Window::clear_state
//=========

void Window::clear_state()
{
	state = UIS_NONE;

	for(u32 i=0; i<m_childs.size(); i++)
		m_childs[i]->clear_state();
}

//=================================================================================================
// Window::accept
//=========

void Window::accept(UIVisitor *visitor)
{
	visitor->visit(this);

	for(u32 i=0; i<m_childs.size(); i++)
		m_childs[i]->accept(visitor);
}

//=================================================================================================
// Window::get_real_pos
//=========

void Window::get_real_pos(float &_x, float &_y)
{
	_x = x;
	_y = y;

	Window *p = m_parent;
	while(p)
	{
		_x += p->x;
		_y += p->y;

		p = p->m_parent;
	}
}

}